/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sgsmcan.Controlador;

import com.sgsmcan.Dao.EnfermedadDao;
import com.sgsmcan.Dao.EnfermedadDaoImpl;
import com.sgsmcan.Dao.HistorialDao;
import com.sgsmcan.Dao.HistorialDaoImpl;
import com.sgsmcan.Dao.PerroDao;
import com.sgsmcan.Dao.PerroDaoImpl;
import com.sgsmcan.Entidad.Enfermedad;
import com.sgsmcan.Entidad.HistorialClinico;
import com.sgsmcan.Entidad.Perro;
import com.sgsmcan.EntidadFiltro.HistorialFiltro;
import com.sgsmcan.Exporter.Exporter;
import com.sgsmcan.Utils.DataExporter;
import com.sgsmcan.Utils.Paginacion;
import com.sgsmcan.Utils.Utilitario;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.NavigationHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author user
 */
@ManagedBean(name = "historialBean")
@ViewScoped
public class HistorialControlador implements Serializable{
    
    private PerroDao daoPerro;
    private HistorialDao daoHistorial;
    private EnfermedadDao daoEnfermedad;
    
    HistorialClinico historial;
    Perro perro;
    LazyDataModel<Perro> perros;
    LazyDataModel<HistorialClinico> historiales;
    List<Enfermedad> enfermedades;
    /*Entidad para filtrar*/
    HistorialFiltro historialFiltro;
    @ManagedProperty("#{usuarioBean}")
    private UsuarioControlador usuarioSesion;
    
    public HistorialControlador() {
        daoPerro = new PerroDaoImpl();
        daoHistorial = new HistorialDaoImpl();
        daoEnfermedad = new EnfermedadDaoImpl();
        historial = new HistorialClinico();
        historial.setEnfermedad(new Enfermedad());
        perro = new Perro();
    }
    
    public void initList(){
        if (!FacesContext.getCurrentInstance().isPostback()) {
            usuarioSesion.generarModulo(4);
            historialFiltro = new HistorialFiltro();
            perros = new Paginacion<Perro>(daoPerro.getPerros());
        }
    }
    
    public void initInsert(){
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = FacesContext.getCurrentInstance().getExternalContext().getFlash().get("idPerroAsig");
            if (parametro == null) {
                FacesContext fc = FacesContext.getCurrentInstance();
                NavigationHandler nh = fc.getApplication().getNavigationHandler();
                nh.handleNavigation(fc, null, "/views/historial/list.xhtml?faces-redirect=true");
            }
            Integer id = (Integer)parametro;
            perro = daoPerro.getPerro(id);
            historial.setPerro(perro);
            historial.setIdUsuario(usuarioSesion.getUsuario().getId());
            enfermedades = daoEnfermedad.getEnfermdades();
        }
    }
    
    public void initUpdate(){
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = FacesContext.getCurrentInstance().getExternalContext().getFlash().get("idHistorial");
            if (parametro == null) {
                FacesContext fc = FacesContext.getCurrentInstance();
                NavigationHandler nh = fc.getApplication().getNavigationHandler();
                nh.handleNavigation(fc, null, "/views/historial/list.xhtml?faces-redirect=true");
            }
            Integer idHistorial = (Integer) parametro;
            historial = daoHistorial.getHistorial(idHistorial);
            perro = historial.getPerro();
            enfermedades = daoEnfermedad.getEnfermdades();
        }
    }
    
    public void busqueda(ActionEvent evnt){
        historiales = new Paginacion<HistorialClinico>(daoHistorial.getHistorialesPorPerro(historialFiltro.getIdPerro()));
    }
    
    public void capturar(Integer id, String nombre){
        historialFiltro.setIdPerro(id);
        historialFiltro.setNombre(nombre);
    }
    
    public void actualizarHistorial(ActionEvent evnt){
        if(!esValido()){
            return;
        }
        try{
            daoHistorial.actualizar(historial);
        }catch(Exception e){
            Utilitario.enviarMensajeGlobalError("Error en el sistema");
            e.printStackTrace();
            return;
        }
        Utilitario.enviarMensajeGlobalValido("Se ha actualizado correctamente");
    }
    
    public void insertarHistorial(ActionEvent evnt){
        if(!esValido()){
            return;
        }
        try{
            historial.setEstado(Boolean.TRUE);
            daoHistorial.insertar(historial);
        }catch(Exception e){
            Utilitario.enviarMensajeGlobalError("Error en el sistema");
            e.printStackTrace();
            return;
        } 
        limpiar();
        Utilitario.enviarMensajeGlobalValido("Se ha guardado correctamente");
    }
    
    public String irCrear(){
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("idPerroAsig",historialFiltro.getIdPerro());
        return "create.xhtml?faces-redirect=true";
    }
    
    public String irActualizar(Integer id){
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("idHistorial",id);
        return "update.xhtml?faces-redirect=true";
    }
    
    private boolean esValido(){
        if(!esPesoValido()){
            return false;
        }
        if(!esEstaturaValida()){
            return false;
        }
        if(!esEnfermedadValida()){
            return false;
        }
        if(!esDiagnostico()){
            return false;
        }
        if(!esTratamientoValido()){
            return false;
        }
        return true;
    }
    
    private boolean esEnfermedadValida(){
        if(historial.getEnfermedad().getId().intValue() == 0){
            Utilitario.enviarMensajeGlobalError("Debe seleccionar una Enfermedad");
            return false;
        }
        return true;
    }
    
    private boolean esDiagnostico(){
        if(Utilitario.esNulo(historial.getDiagnostico())){
            Utilitario.enviarMensajeGlobalError("Debe ingresar el diagnostico");
            return false;
        }
        return true;
    }
    
    private boolean esTratamientoValido(){
        if(Utilitario.esNulo(historial.getDiagnostico())){
            Utilitario.enviarMensajeGlobalError("Debe ingresar el Tratamiento");
            return false;
        }
        return true;
    }
    
    private boolean esPesoValido(){
        if(historial.getPeso() <= 0.00){
            Utilitario.enviarMensajeGlobalError("Debe ingresar el Peso");
            return false;
        }
        return true;
    }
    
    private boolean esEstaturaValida(){
        if(historial.getEstatura() <= 0.00){
            Utilitario.enviarMensajeGlobalError("Debe ingresar la estatura");
            return false;
        }
        return true;
    }
    
    private void limpiar(){
        historial = new HistorialClinico();
        historial.setEnfermedad(new Enfermedad());
    }
    
    public void prepararEliminar(int id){
        historial.setId(id);
    }
    
    public void eliminarHistorial(ActionEvent event){
        HistorialClinico historialClinico = daoHistorial.getHistorial(historial.getId());
        historialClinico.setEstado(Boolean.FALSE);
        perro.setId(historialFiltro.getIdPerro());
        historialClinico.setPerro(perro);
        daoHistorial.eliminar(historialClinico);
        Utilitario.enviarMensajeGlobalValido("Se ha eliminado correctamente");
    }
    
    public void exportar(ActionEvent event) {
        Paginacion<HistorialClinico> paginacion = (Paginacion<HistorialClinico>) historiales;
        List<HistorialClinico> lista = paginacion.getAllList();
        if (lista.isEmpty()) {
            return;
        }
        Perro auxiliar =((HistorialClinico)lista.get(0)).getPerro();
        Exporter exporter = lista.get(0);
        DataExporter<HistorialClinico> dataExporter = new DataExporter<HistorialClinico>(exporter);
        dataExporter.agregarHeader("id : "+auxiliar.getId()+" nombre : "+auxiliar.getNombre());
        dataExporter.crearDocumento(lista);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext = DataExporter.getResponseContent(externalContext,"historiales");
        try {
            OutputStream outputStream = externalContext.getResponseOutputStream();
            dataExporter.exportarDocumento(outputStream);
            externalContext.setResponseStatus(200);
            externalContext.responseFlushBuffer();
            facesContext.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    
    /** GETTER AND SETTER   **/
    
    public HistorialClinico getHistorial() {
        return historial;
    }

    public void setHistorial(HistorialClinico historial) {
        this.historial = historial;
    }

    public LazyDataModel<HistorialClinico> getHistoriales() {
        return historiales;
    }

    public void setHistoriales(LazyDataModel<HistorialClinico> historiales) {
        this.historiales = historiales;
    }

    public HistorialFiltro getHistorialFiltro() {
        return historialFiltro;
    }

    public void setHistorialFiltro(HistorialFiltro historialFiltro) {
        this.historialFiltro = historialFiltro;
    }

    public LazyDataModel<Perro> getPerros() {
        return perros;
    }

    public void setPerros(LazyDataModel<Perro> perros) {
        this.perros = perros;
    }

    public Perro getPerro() {
        return perro;
    }

    public void setPerro(Perro perro) {
        this.perro = perro;
    }

    public void setUsuarioSesion(UsuarioControlador usuarioSesion) {
        this.usuarioSesion = usuarioSesion;
    }

    public List<Enfermedad> getEnfermedades() {
        return enfermedades;
    }

    public void setEnfermedades(List<Enfermedad> enfermedades) {
        this.enfermedades = enfermedades;
    }
    
    
}
